package org.example.controller;

import lombok.extern.slf4j.Slf4j;
import org.example.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

//使用@RestController，方法返回值的内容，是响应正文的内容
//@RestController
//@RestController是组合注解，表示@Controller+@ResponseBody
@RestController
//@Controller
//@ResponseBody
@RequestMapping("/test")
@Slf4j
public class TestController {

//    //接收数据：QueryString
//    //路径：/user/simpleType?username=abc&password=123
//    //使用基础数据类型/包装类型（简单类型）
//    @RequestMapping("/simpleType")
//    public String 基础数据类型and包装类型接受(String username,String password){
//        log.debug("username={},password={}",username,password);
//        return "孔子说：中午不睡觉，下午嗷嗷叫；孟子说：孔子说的对";
//    }


    // 路径：/test/simpleType
    // 后端：使用基础数据类型/包装类型(简单类型)
    // 前端请求数据：queryString，表单格式，form-data的简单类型
    @RequestMapping("/simpleType")
    public String 简单类型and没有注解(
                                String username,
                                String password,
                                int age){
        log.debug("username={}, password={}, age={}", username, password, age);
        return "孔子说：中午不睡觉，下午嗷嗷叫；孟子说：孔子说的对";
    }

    @RequestMapping("/requestParam")
    public String 简单类型andRequestParam注解(
            //必填字段
            @RequestParam String username,
            @RequestParam String password,
            // 设置required=false, 和不加注解作用一样：表示选填
            @RequestParam(required = false) Integer age){
        log.debug("username={}, password={}, age={}", username, password, age);
        return "孔子说：中午不睡觉，下午嗷嗷叫；孟子说：孔子说的对";
    }

    //使用对象来接收请求数据
    @RequestMapping("/object")
    public String 对象(User user){
        log.debug("user对象接收的数据：{}", user);
        return "孔子说：中午不睡觉，下午嗷嗷叫；孟子说：孔子说的对";
    }

    //接收form-data上传的文件：请求是form-data格式，包含head字段的文件
    //可能后端报错，是因为先要删除c盘下某个文件，然后把上传的文件保存在服务端本地c盘
    //但是没有权限，就会报错=>以管理员权限，打开idea
    @RequestMapping("/upload1")
    public String 对象(MultipartFile head){
        log.debug("接收的上传文件名称：{}", head.getOriginalFilename());
        return "孔子说：中午不睡觉，下午嗷嗷叫；孟子说：孔子说的对";
    }

    @RequestMapping("/upload2")
    public String 上传文件2(@RequestParam MultipartFile head){
        log.debug("接收的上传文件名称：{}", head.getOriginalFilename());
        return "孔子说：中午不睡觉，下午嗷嗷叫；孟子说：孔子说的对";
    }

    @RequestMapping("/upload3")
    public String 上传文件3(@RequestPart MultipartFile head){
        log.debug("接收的上传文件名称：{}", head.getOriginalFilename());
        return "孔子说：中午不睡觉，下午嗷嗷叫；孟子说：孔子说的对";
    }



    //接收json格式的数据：@RequestBody
    @RequestMapping("/json")
    public String json(@RequestBody User user){
        log.debug("user对象接收的数据：{}", user);
        return "孔子说：中午不睡觉，下午嗷嗷叫；孟子说：孔子说的对";
    }

    //接收可变的路径变量：@PathVariable
    @RequestMapping("/query/{id}")
    //public String 路径变量(@PathVariableInteger id){
    public String 路径变量(@PathVariable("id") Integer userId){
        log.debug("路径变量：{}", userId);
        return "孔子说：中午不睡觉，下午嗷嗷叫；孟子说：孔子说的对";
    }


    //接收请求头Cookie中的某个字段的值：@CookieValue
    //如果真实的开发，可以在服务端返回Set-Cookie，或客户端js代码来设置客户端的cookie信息
    //然后客户端每次请求，就会自动的携带Cookie
    @RequestMapping("/cookie")
    public String cookie(@CookieValue String xxx){
        log.debug("获取到的Cookie字段：{}", xxx);
        return "孔子说：中午不睡觉，下午嗷嗷叫；孟子说：孔子说的对";
    }

    //获取请求头某个字段的值：@RequestHeader
    @RequestMapping("/header")
    public String header(@RequestHeader("Accept-Encoding") String encoding){
        log.debug("获取到的Header字段：{}", encoding);
        return "孔子说：中午不睡觉，下午嗷嗷叫；孟子说：孔子说的对";
    }

    //会话管理：基于Session和Cookie来实现
    //模拟登录创建session
    @RequestMapping("/login")
    public String login(String username,
                        String password,
                        HttpServletRequest req){
        log.debug("username：{}, password: {}", username, password);
        //登录成功
        if("abc".equals(username) && "123".equals(password)){
            //创建session（创建sessionId及Session对象）并返回Set-Cookie（sessionId）
            HttpSession session = req.getSession();
            //在session对象中保存键值对的数据
            session.setAttribute("user", "随便设置的会话用户");
        }
        return "孔子说：中午不睡觉，下午嗷嗷叫；孟子说：孔子说的对";
    }

    //获取session中某个字段的值：@SessionAttribute
    @RequestMapping("/getSession")
    public String getSession(@SessionAttribute("user") String user){
        log.debug("获取Session中的用户: {}", user);
        return "孔子说：中午不睡觉，下午嗷嗷叫；孟子说：孔子说的对";
    }
}